package com.uniflow.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uniflow.entity.SystemConfig;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 系统配置Mapper接口
 * 
 * @author uniflow
 * @since 1.0.0
 */
@Mapper
public interface SystemConfigMapper extends BaseMapper<SystemConfig> {
    
    /**
     * 分页查询系统配置
     */
    IPage<SystemConfig> selectConfigPage(Page<SystemConfig> page,
                                        @Param("category") String category,
                                        @Param("configType") String configType,
                                        @Param("isPublic") Boolean isPublic,
                                        @Param("isEncrypted") Boolean isEncrypted,
                                        @Param("keyword") String keyword);
    
    /**
     * 根据配置键查询
     */
    SystemConfig selectByConfigKey(@Param("configKey") String configKey);
    
    /**
     * 检查配置键是否存在
     */
    boolean existsByConfigKey(@Param("configKey") String configKey, @Param("excludeId") String excludeId);
    
    /**
     * 根据分类查询配置列表
     */
    List<SystemConfig> selectByCategory(@Param("category") String category);
    
    /**
     * 查询公开配置列表
     */
    List<SystemConfig> selectPublicConfigs();
    
    /**
     * 查询私有配置列表
     */
    List<SystemConfig> selectPrivateConfigs();
    
    /**
     * 根据配置类型查询
     */
    List<SystemConfig> selectByConfigType(@Param("configType") String configType);
    
    /**
     * 查询加密配置列表
     */
    List<SystemConfig> selectEncryptedConfigs();
    
    /**
     * 批量更新配置值
     */
    int batchUpdateConfigValue(@Param("configs") List<Map<String, Object>> configs);
    
    /**
     * 根据配置键批量查询
     */
    List<SystemConfig> selectByConfigKeys(@Param("configKeys") List<String> configKeys);
    
    /**
     * 查询配置分类列表
     */
    List<String> selectCategories();
    
    /**
     * 查询配置类型列表
     */
    List<String> selectConfigTypes();
    
    /**
     * 查询配置统计信息
     */
    Map<String, Object> selectConfigStats();
    
    /**
     * 查询分类配置统计
     */
    List<Map<String, Object>> selectCategoryStats();
    
    /**
     * 查询类型配置统计
     */
    List<Map<String, Object>> selectTypeStats();
    
    /**
     * 查询最近更新的配置
     */
    List<SystemConfig> selectRecentUpdated(@Param("limit") Integer limit);
    
    /**
     * 查询最近创建的配置
     */
    List<SystemConfig> selectRecentCreated(@Param("limit") Integer limit);
    
    /**
     * 查询配置变更历史
     */
    List<Map<String, Object>> selectChangeHistory(@Param("configKey") String configKey,
                                                  @Param("startDate") String startDate,
                                                  @Param("endDate") String endDate);
    
    /**
     * 查询配置使用统计
     */
    List<Map<String, Object>> selectUsageStats(@Param("configKey") String configKey);
    
    /**
     * 查询未使用的配置
     */
    List<SystemConfig> selectUnusedConfigs();
    
    /**
     * 查询配置依赖关系
     */
    List<Map<String, Object>> selectDependencies(@Param("configKey") String configKey);
    
    /**
     * 验证配置值格式
     */
    boolean validateConfigValue(@Param("configType") String configType, @Param("configValue") String configValue);
    
    /**
     * 查询配置模板
     */
    List<SystemConfig> selectConfigTemplates(@Param("category") String category);
    
    /**
     * 批量插入配置
     */
    int insertBatch(@Param("configs") List<SystemConfig> configs);
    
    /**
     * 导出配置数据
     */
    List<SystemConfig> selectForExport(@Param("categories") List<String> categories,
                                      @Param("includePrivate") Boolean includePrivate,
                                      @Param("includeEncrypted") Boolean includeEncrypted);
    
    /**
     * 查询配置备份信息
     */
    List<Map<String, Object>> selectBackupInfo(@Param("configKey") String configKey);
    
    /**
     * 恢复配置到指定版本
     */
    int restoreConfigVersion(@Param("configKey") String configKey, @Param("version") String version);
    
    /**
     * 查询配置权限
     */
    List<Map<String, Object>> selectConfigPermissions(@Param("configKey") String configKey);
    
    /**
     * 检查用户是否有配置访问权限
     */
    boolean hasConfigPermission(@Param("userId") String userId, @Param("configKey") String configKey, @Param("action") String action);
    
    /**
     * 查询配置审计日志
     */
    List<Map<String, Object>> selectAuditLogs(@Param("configKey") String configKey,
                                              @Param("startDate") String startDate,
                                              @Param("endDate") String endDate);
    
    /**
     * 查询系统默认配置
     */
    List<SystemConfig> selectDefaultConfigs();
    
    /**
     * 重置配置到默认值
     */
    int resetToDefault(@Param("configKey") String configKey);
    
    /**
     * 批量重置配置
     */
    int batchResetToDefault(@Param("configKeys") List<String> configKeys);
}